package token

import (
	"autoDeploy/config"
	"autoDeploy/dao/redis"
	"context"
	"errors"
	"fmt"
	"time"
)

var ctx = context.Background()

//	AddToken
//
// 描述信息：（id，token）存入redis中，并设置过期时间
//
// Param：
//
//	id ：用户id
//	token ：token
//	expiration ：token的过期时间
//
// Return：
//
//	error ：错误信息
func AddToken(id string, token string, expiration time.Duration) error {
	client, err := redis.CreateRedisClient(config.RedisAddr, config.RedisPassword, config.RedisDB)
	if err != nil {
		return fmt.Errorf("failed to create Redis client: %v", err)
	}

	_, err = client.Set(ctx, "token:"+id, token, expiration).Result()
	if err != nil {
		return fmt.Errorf("failed to set token: %v", err)
	}

	err = redis.DestroyRedisClient(client)
	if err != nil {
		return fmt.Errorf("无法销毁redis实例: %v", err)
	}

	return nil
}

//	DeleteToken
//
// 描述信息：根据 用户id 在redis中删除token
//
// Param：
//
//	id ：用户id
//
// Return：
//
//	error ：错误信息
func DeleteToken(id string) error {
	client, err := redis.CreateRedisClient(config.RedisAddr, config.RedisPassword, config.RedisDB)
	if err != nil {
		return fmt.Errorf("failed to create Redis client: %v", err)
	}

	_, err = client.Del(ctx, "token:"+id).Result()
	if err != nil {
		return fmt.Errorf("failed to delete token: %v", err)
	}

	err = redis.DestroyRedisClient(client)
	if err != nil {
		return fmt.Errorf("无法销毁redis实例: %v", err)
	}

	return nil
}

//	UpdateToken
//
// 描述信息：更新token
//
// Param：
//
//	id ：用户id
//	token ：token
//	expiration ：token持续时间
//
// Return：
//
//	error ：错误信息
func UpdateToken(id string, token string, expiration time.Duration) error {
	client, err := redis.CreateRedisClient(config.RedisAddr, config.RedisPassword, config.RedisDB)
	if err != nil {
		return fmt.Errorf("failed to create Redis client: %v", err)
	}
	_, err = client.Set(ctx, "token:"+id, token, expiration).Result()
	if err != nil {
		return fmt.Errorf("failed to update token: %v", err)
	}

	err = redis.DestroyRedisClient(client)
	if err != nil {
		return fmt.Errorf("无法销毁redis实例: %v", err)
	}

	return nil
}

//	GetToken
//
// 描述信息：根据 用户id 获取token
//
// Param：
//
//	id ：用户id
//
// Return：
//
//	string ：0 token不存在：1 函数执行失败：token
//	error ：错误信息
func GetToken(id string) (string, error) {
	client, err := redis.CreateRedisClient(config.RedisAddr, config.RedisPassword, config.RedisDB)
	if err != nil {
		return "1", fmt.Errorf("failed to create Redis client: %v", err)
	}

	token, err := client.Get(ctx, "token:"+id).Result()
	if errors.Is(err, redis.Nil) {
		return "0", fmt.Errorf("token not found")
	}
	if err != nil {
		return "1", fmt.Errorf("failed to get token: %v", err)
	}

	err = redis.DestroyRedisClient(client)
	if err != nil {
		return "1", fmt.Errorf("无法销毁redis实例: %v", err)
	}

	return token, nil
}
